package list

/*

腾讯精选第一题

给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
请你将两个数相加，并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外，这两个数都不会以 0 开头

输入：l1 = [2,4,3], l2 = [5,6,4]
输出：[7,0,8]
解释：342 + 465 = 807.

*/

// 执行用时：12 ms 71.48%
// 内存消耗：4.6 MB 78.44%
// 自己思考同时结合了答案
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {

	if l2 == nil {
		return l1
	}

	if l1 == nil {
		return l2
	}

	var node *ListNode
	var head *ListNode
	addOne := false

	// 直到两个都遍历完
	// 个人的想法是先算出长度，实际上通过nil来判断更好
	for l1 != nil || l2 != nil {
		v1, v2 := 0, 0 // 拿一个中间值来记，如果是nil，那么就是0
		if l1 != nil {
			v1 = l1.Val
			l1 = l1.Next
		}

		if l2 != nil {
			v2 = l2.Val
			l2 = l2.Next
		}

		sum := v1 + v2
		if addOne {
			sum += 1
			addOne = false
		}
		if sum >= 10 {
			sum -= 10
			addOne = true
		}

		if head == nil {
			head = &ListNode{Val: sum, Next: nil}
			node = head
		} else {
			node.Next = &ListNode{Val: sum, Next: nil}
			node = node.Next
		}
	}

	// 多进行一次判断看后面是否需要进位
	if addOne {
		node.Next = &ListNode{Val: 1}
	}

	return head

}
